Skip to content

Conversation

@tolk-vm
Copy link
Collaborator

@tolk-vm tolk-vm commented Nov 24, 2025

Live demo: https://companyname-a7d5b98e-tolk-docs.mintlify.app/languages/tolk/overview

I have completed a long effort to provide a from-scratch documentation for Tolk.

The previous version, which I had been incrementally maintaining since January, focused on "Tolk vs FunC" differences.

The new one does not require any prior knowledge of FunC. A reader approaches Tolk directly.

The documentation contains many examples, snippets, and real-world cases. Before starting this work, I reviewed the official docs for Rust, Go, and Kotlin — to absorb best practices for presenting a programming language.

What's inside: brief description

Every aspect of the Tolk language is covered:

  • Type system — every type has its own page. Numbers, addresses, other atomics, structures and generics, nullable and union types, tuples, maps, callables, etc. Each page includes nuances and examples. Overall pages describing how each type is represented in TVM and serialized into cells are also included.
  • Syntax details — how various language constructs look and what they are used for. Variables, conditions, loops, exceptions, functions, methods, imports, etc. Grouped into distinct pages, with examples and usage guidelines.
  • Language features — how to use Tolk for TON smart contracts. Handling and sending messages, storage and get-methods, auto-serialization, lazy loading, etc. Every page focuses on a dedicated topic and provides a deep dive, including answers to common questions.
  • Migrating from FunC — a fully redesigned set of pages for developers coming from FunC. No separate "in short" and "in detail" versions; instead, a single long-read with short examples and references to other pages.

Additionally, there are two entry-point pages:

  • Basic syntax — to get an overall picture of how the language looks.
  • Idioms and conventions — best practices for writing idiomatic Tolk code.

The english style used while writing

All pages are written in a short, formal style (as opposed to the PR descriptions I like to create).

  • no introductory sentences, like "this page describes ..." or "here we will learn ..." — clear and to the point
  • no second-person rule ("you", "we") — although in a few specific places I intentionally used "you"
  • pixel-perfect rendering — I not only "just write" the content, but always check how it renders in a browser. The goal is to avoid hanging words, keep line lengths readable, keep bullets one-line where possible, etc. In many places, the English may be slightly incorrect — and most of those cases are intentional for shortening and precise rendering.

Syntax highlighting!

The current documentation lacks of syntax highlighing, because Mintlify does not support custom languages. FunC, Fift, etc. — all of them are rendered as black plain text.

Tolk documentation contains hundreds of snippets and looks too depressive without highlithing.

That's why I implemented a temporary solution — all snippets are now colorful, in both dark and light modes. Just take a look:

syntax-highlighting

All ```tolk snippets are highlighted automatically: no changes in mdx markup is required.

The highlighing is client-side, via Prism.js, whose sources are embedded. See snippets/tolk-highlight.jsx. This component is injected into every /languages/tolk/ page.

Hopefully, some day, Mintlify will introduce native server-side highlighing. Then, we can discuss across coloring. I fine-tuned grammar and palette the way I prefer it (for example, structures and variables have different colors, because of the capital letter). The current VS Code tmLanguage file is not suitable for this — it must be updated.

For reviewers

If anyone decides to review all the text in this PR, keep this in mind:

  • ... three dots in code snippets are intentional; small snippets are not meant to be copy-pasted — they demonstrate a specific feature
  • "you" is intentionally used in several (seldom) places, even though it formally breaks a no second-person rule, because in those places it sounds significantly better

About merging this PR

Git history is split into multiple sensible commits. For instance, a syntax highlighter is a separate commit.

It's up to you whether to "Squash and merge" all changes into a single commit or to "Rebase and merge" to preserve Git history. I do not see any disadvantages in having multiple commits.

For future changes

If anyone plans to modify the contents in the Tolk documentation, please remember:

  • pixel-perfect rendering — do not change content (especially replacing short words with long ones) without checking how it renders with default settings (100% zoom, desktop). Avoid handing words, prefer one-line bullets, and double-check whether a particular word was chosen specifically to fit the line.
  • syntax highlighting — described above

The documentation in numbers

All together, the new Tolk documentation contains:

  • 46 pages
  • 480 ```tolk snippets
  • 40000 words
  • 280000 characters

I invested ~200 hours developing the text and picking every word — exactly 14 days, about 14 hours a day.

I hope that, cumulatively, this documentation will save noticeably more time for all TON developers.

Closes #1136
Closes #1473
Closes #1114
Closes #73
Closes #1128

Live demo: https://companyname-a7d5b98e-tolk-docs.mintlify.app/languages/tolk/overview

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the solid Tolk docs update; I left several style and wording suggestions in languages/tolk files—please apply the inline suggestions where they make sense.

Comment on lines +97 to +99
For years, FunC was the primary language for TON.
It gave complete control over the TVM — and if you mastered it, it gave you power.
But its Lisp-like syntax and functional style made onboarding difficult for many.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[HIGH] Second-person pronoun and hype in FunC origin note

The sentence “It gave complete control over the TVM — and if you mastered it, it gave you power.” addresses the reader with “you” and uses hype-style wording (“gave you power”). This violates the guidelines against personal pronouns and marketing-style language in technical documentation. The surrounding narrative can remain factual while removing the second person and hype.

Suggested change
For years, FunC was the primary language for TON.
It gave complete control over the TVM — and if you mastered it, it gave you power.
But its Lisp-like syntax and functional style made onboarding difficult for many.
For years, FunC was the primary language for TON.
It provided complete control over the TVM for developers who mastered it.
But its Lisp-like syntax and functional style made onboarding difficult for many.

Please leave a reaction 👍/👎 to this suggestion to improve future reviews for everyone!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Intentional "you", see the MR description

Comment on lines +209 to +218
obj.toCell({
// for `bits128` and similar (a slice under the hood),
// insert the checks (bits == 128 and refs == 0);
// turn off to save gas if you guarantee input is valid;
// `intN` are always validated, it's only for `bitsN`
skipBitsNValidation: false, // default: false

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[HIGH] Second-person pronoun in auto-serialization options comment

The inline comment “// turn off to save gas if you guarantee input is valid;” uses “you” to refer to the reader, even though this is explanatory documentation embedded in a code example. This conflicts with the style rule to avoid second-person pronouns in docs, including explanatory comments used for teaching. The meaning can be preserved by referring to conditions on the input instead.

Please leave a reaction 👍/👎 to this suggestion to improve future reviews for everyone!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Intentional "you", see the MR description

Comment on lines 13 to 15
<Aside
type="caution"
>
This page gives brief descriptions of optimizations performed.
It is fairly low-level and not required for using Tolk in production.
</Aside>

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[HIGH] Throat-clearing “this page/section” openers

Multiple newly added Tolk pages start sections with self-referential “this page/section” sentences instead of leading directly with value, which the style guide flags as throat-clearing. In features/compiler-optimizations.mdx, the caution aside says “This page gives brief descriptions of optimizations performed. It is fairly low-level and not required for using Tolk in production.”; similar constructions appear in features/message-sending.mdx (“This section is intended for experienced users; it discusses terminology.”), syntax/operators.mdx, syntax/structures-fields.mdx, types/list-of-types.mdx, types/overall-serialization.mdx, and types/overall-tvm-stack.mdx. These meta statements add cognitive overhead without conveying new information. Rephrasing them into direct summaries of purpose, audience, or prerequisites keeps the docs concise and aligned with the style rule.

Suggested change
<Aside
type="caution"
>
This page gives brief descriptions of optimizations performed.
It is fairly low-level and not required for using Tolk in production.
</Aside>
<Aside
type="caution"
>
Summarizes compiler optimizations that affect gas usage.
Intended as low-level background; not required for typical Tolk development.
</Aside>

Please leave a reaction 👍/👎 to this suggestion to improve future reviews for everyone!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not the start of the page, it's an <Aside> element after, placed specifically to attract visual attention

Comment on lines +193 to +197
If you use `RichBounce`, that's the way:

```tolk
fun onBouncedMessage(in: InMessageBounced) {
val rich = lazy RichBounceBody.fromSlice(in.bouncedBody);
// handle rich.originalBody
// use rich.xxx to get exitCode, gasUsed, and so on
}
```

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[HIGH] Second-person pronoun in RichBounce handling guidance

The line “If you use RichBounce, that's the way:” addresses the reader directly with “you”. This breaks the rule against using “you/your” in documentation and mixes instructional tone with informal phrasing (“that's the way”). The surrounding section already describes BounceMode variants objectively, so this sentence can be made neutral and descriptive.

Please leave a reaction 👍/👎 to this suggestion to improve future reviews for everyone!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Intentional "you", see the MR description

Comment on lines +40 to +44
- sometimes, you "send to an address"
-     ... but sometimes, you have workchain + hash
- sometimes, you compose `StateInit` from code+data
-     ... but sometimes, `StateInit` is a ready cell
- sometimes, you send a message to basechain
-     ... but sometimes, you use a `MY_WORKCHAIN` constant
- sometimes, you just attach tons (msg value)
-     ... but sometimes, you also need extra currencies

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[HIGH] Second-person pronouns in createMessage union examples

The bullet list under “The concept is based on union types” uses multiple second-person constructions such as “sometimes, you 'send to an address'” and “sometimes, you just attach tons (msg value)”. These directly address the reader instead of describing generic behaviors, violating the no-“you/your” rule for documentation text. The list is otherwise explaining patterns of usage and can be written in neutral terms.

Suggested change
- sometimes, you "send to an address"
-     ... but sometimes, you have workchain + hash
- sometimes, you compose `StateInit` from code+data
-     ... but sometimes, `StateInit` is a ready cell
- sometimes, you send a message to basechain
-     ... but sometimes, you use a `MY_WORKCHAIN` constant
- sometimes, you just attach tons (msg value)
-     ... but sometimes, you also need extra currencies

Please leave a reaction 👍/👎 to this suggestion to improve future reviews for everyone!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Intentional "you", see the MR description

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One more comment about "you" in these intentional places:

Even in strict docs of Rust, LLVM, Oracle, etc. it's also quite typical:

  • Sometimes you need…
  • Sometimes you have…
  • etc.

Like here. What's important:
It does not address the reader, contains no imperatives, and avoids direct dialogue.
It is simply a description of a situation, not an interaction with the user.

Comment on lines +261 to +267
Returns `uint256` — a new pseudo-random number.

Ensure you've called `random.initialize` to make it unpredictable!

#### random.range(limit)

Returns `int` — a new pseudo-random integer z in the range `0..limit−1` (or `limit..−1` if negative).
More precisely, an unsigned random value `x` is generated, then `z := x * limit / 2^256` is computed.

Ensure you've called `random.initialize` to make it unpredictable!

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[HIGH] Second-person pronouns in random API notes

Within the random.uint256 and random.range documentation, the line “Ensure you've called random.initialize to make it unpredictable!” appears twice. Both instances directly address the reader with “you've”, which conflicts with the style rule against second-person pronouns in documentation prose. The intent—documenting the need to initialize randomness—can be expressed in a neutral imperative form instead.

Please leave a reaction 👍/👎 to this suggestion to improve future reviews for everyone!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Intentional "you", see the MR description

Comment on lines 533 to 535
- Do you need validation or just proxy any data as-is?
- Do you need custom error codes while validating?
- Do you need to assign it dynamically or just to carry it forward?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[HIGH] Second-person pronouns in jetton forward-payload questions

Lines 533–535 ask the reader “Do you need …” three times, directly addressing the reader with “you”. This conflicts with the documentation style rule to avoid second-person pronouns in descriptive guidance. The surrounding section is otherwise neutral and technical, so the second-person phrasing stands out as inconsistent with the rest of the Tolk docs.

Suggested change
- Do you need validation or just proxy any data as-is?
- Do you need custom error codes while validating?
- Do you need to assign it dynamically or just to carry it forward?

Please leave a reaction 👍/👎 to this suggestion to improve future reviews for everyone!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Intentional "you", see the MR description

Comment on lines 52 to 53
If you are migrating from FunC:

int currentCounter() method_id {
load_data(); ;; fills global variables
return ctx_counter;
}
```
</details>
- Look through [benchmarks](https://github.com/ton-blockchain/tolk-bench): notice **30–50% lower gas fees**.
- Scan the page [Tolk vs FunC](/languages/tolk/from-func/tolk-vs-func) to get the overall picture.
- Use the [FunC-to-Tolk converter](/languages/tolk/from-func/converter) to migrate existing projects.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[HIGH] Second-person pronoun in FunC migration note

The line “If you are migrating from FunC:” explicitly addresses the reader with “you”. This violates the style rule banning second-person pronouns in documentation, even though the rest of the migration guidance is written neutrally. The heading line can be rephrased to describe the migration topic without addressing the reader directly.

Please leave a reaction 👍/👎 to this suggestion to improve future reviews for everyone!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Intentional "you", see the MR description

@tolk-vm
Copy link
Collaborator Author

tolk-vm commented Nov 28, 2025

I have corrected various misprints you've found.
Rebased the changes and force-pushed to keep Git history able to merge as distinct commits.
Live demo link remains the same:
https://companyname-a7d5b98e-tolk-docs.mintlify.app/languages/tolk/overview

Copy link
Collaborator

@novusnota novusnota left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm soft-rejecting the current hack because there is a cleaner iteration of it that preserves the color integrity of non-Tolk code, makes all Tolk code blocks apparent with a title, and lets us delete the <TolkHighlight/> component and enable Tolk code highlighting throughout the docs.

See my notes here: https://github.com/ton-org/docs/pull/1421/files#r2572169983

@tolk-vm
Copy link
Collaborator Author

tolk-vm commented Nov 29, 2025

I'm soft-rejecting the current hack because there is a cleaner iteration of it that preserves the color integrity of non-Tolk code, makes all Tolk code blocks apparent with a title, and lets us delete the <TolkHighlight/> component and enable Tolk code highlighting throughout the docs.

Let's continue discussing the solution to avoid <TolkHighlight> there

@github-actions
Copy link

github-actions bot commented Dec 1, 2025

bouncer.yml

The most recent commit has made this PR go over 800 added lines. Please, decrease the size of this pull request or consider splitting it into several smaller requests.

Until then, the CI will be marked as failed.

UPD: #1504

@tolk-vm
Copy link
Collaborator Author

tolk-vm commented Dec 1, 2025

A fatal mistake: decided to rebase a branch onto 'main' to have a fresh live demo.

@novusnota
Copy link
Collaborator

novusnota commented Dec 1, 2025

A fatal mistake: decided to rebase a branch onto 'main' to have a fresh live demo.

Yeah, we're experimenting with things, and on top of that, Dependabot (seems to have) pushed an incomplete package-lock.json, so it is what it is. Fixes incoming: 1, 2.

A couple of points regarding the bouncer.yml:

  1. It shall be a bit less noisy, and that is being resolved.
  2. It already ignores changes to package-lock.json, tvm/instructions.mdx, and many other generated files, scripts, and snippets, because this check is mainly concerned with new docs and how easy it is to review things when they're smaller.
  3. It is meant as a guideline, so the wording of its messages will be smoothed out with time. Perhaps, once some checks become truly mandatory, while checks made by this workflow won't.
  4. We've checked the size of the biggest doc pages, and they rarely exceed 500 lines. That is to say, trying to do a lot at once is fun, and I'm a big fan of that personally, but it's very daunting for reviewers. Like, ambition and initiative are still appreciated, but clarity and manageability of contributions are also important for effective collaboration ¯\_(ツ)_/¯.

Sorry for the possible inconveniences along this bumpy way :)

P.S.: Rebases hinder reviews to some degree, because GitHub starts to consider all viewed files as new ones on each rebase. Not to mention the annoying search for comments that were made on files present during some point in the past but were deleted since then.

@verytactical
Copy link
Collaborator

I think it was already discussed internally, but will write about this here too.

@aigerimu is splitting this large PRs into single-article PRs and editing style/language issues, so that we can ensure reviewing it won't take forever.

When the process is over, we'll likely close this PR. If we closed it right now, Mintlify would turn off the link in the title of the PR, and we'd prefer to have it for reference.

At the moment, I'll move the PR to Draft status, so that it doesn't show up in the filtered list of PRs for daily review.

@verytactical verytactical marked this pull request as draft December 3, 2025 09:22
@tolk-vm
Copy link
Collaborator Author

tolk-vm commented Dec 3, 2025

Mda

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

6 participants